# -*- coding: utf-8 -*-
import webapp2 
import jinja2
import os

import datetime

jinja_environment = jinja2.Environment(
	loader = jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'plantillas')))

from google.appengine.ext import db #base de datos
from google.appengine.ext import blobstore #subir ficheros
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.api import users #api_usuarios
from google.appengine.api import images #trabajar con imagenes

#clases base de datos
class Cliente(db.Model):
	"""almacena la informacion sobre el cliente"""
	user_id=db.StringProperty()
	registro=db.DateProperty()
	email=db.EmailProperty()
	password=db.StringProperty()
	
#es necesario este modelo porque no podemos hacer GROUP BY 
#en consultas a Anuncio
class Ciudad(db.Model):
	"""almacena las ciudades en las que hay anuncios"""
	nombre=db.StringProperty()
	popularidad=db.IntegerProperty() #Numero de anuncios que hay en la ciudad
	
class Anuncio(db.Model):
	"""almacena la información del anuncio de la empresa"""
	nombre=db.StringProperty()
	provincia=db.StringProperty()
	localidad=db.StringProperty()
	direccion=db.TextProperty()
	telefono=db.PhoneNumberProperty()
	url=db.LinkProperty()
	registro=db.DateProperty()
	descripcion=db.TextProperty()
	validada=db.BooleanProperty()
	estado=db.StringProperty()
	paykey=db.StringProperty()
	cliente=db.ReferenceProperty(Cliente, collection_name='anuncios')
	
class Tag(db.Model):
	"""almacena los tag disponible para ser usados"""
	nombre=db.StringProperty()
	
class Tags(db.Model):
	"""almacena los tag correspondientes a cada anuncio"""
	nombre=db.ReferenceProperty(Tag)
	anuncio=db.ReferenceProperty(Anuncio)
	valor=db.StringProperty()

#Gestión
class PaginaPrincipal(webapp2.RequestHandler):
	"""Pagina Principal"""
	def get(self): #mostrar pagina
		#comprobar
		#login
		user = users.get_current_user()
		administrador=False
		if user:
			url = users.create_logout_url(self.request.uri)
			url_text = 'logout'
			
		else:
			url = users.create_login_url(self.request.uri)
			url_text = 'login'
		
		#ordenar por popularidad
		ciudades=Ciudad.all()
		ciudades.order('-popularidad')

		#variable de la plantilla
		template_values={
			'url': url,
			'url_text': url_text,
			'nombre_usuario': user,
			'administrador': users.is_current_user_admin(),
			'ciudades':ciudades.run(limit=10), #top-ten ciudades
		}
		
		template = jinja_environment.get_template('index.html')
		self.response.out.write(template.render(template_values))
			
		
class PaginaBusqueda(webapp2.RequestHandler):
	"""Pagina Principal"""
	def get(self): #mostrar pagina
		#TODO todo en minuscula
		#sustituir espacios por guiones bajos:
		nombre_original = self.request.get('anuncio')
		nombre = nombre_original.replace(' ','_')

		#busqueda
		anuncios = db.GqlQuery("SELECT * "
				       "FROM Anuncio "
				       "WHERE nombre = :1 "
				       "ORDER BY nombre DESC",
				       nombre)
		
		#variable de la plantilla
		template_values={
			'administrador': users.is_current_user_admin(),
			'anuncios': anuncios,
		}
		
		template = jinja_environment.get_template('busqueda.html')
		self.response.out.write(template.render(template_values))
		

class PaginaAnuncio(webapp2.RequestHandler):
	"""Pagina Principal"""
	def get(self, nombre_anuncio): #mostrar pagina
		#Mostrar anuncio
		anuncios = db.GqlQuery("SELECT * "
				       "FROM Anuncio "
				       "WHERE nombre = :1 ",
				       nombre_anuncio)
		
		#variable de la plantilla
		template_values={
			'administrador': users.is_current_user_admin(),
			'anuncios': anuncios,
		}
		
		template = jinja_environment.get_template('anuncio.html')
		self.response.out.write(template.render(template_values))
		
		
class PaginaPerfilAnuncio(webapp2.RequestHandler):
	"""Pagina Principal"""
	def get(self, nombre_anuncio): #mostrar pagina
		#variable de la plantilla
		template_values={}
		
		template = jinja_environment.get_template('perfil_anuncio.html')
		self.response.out.write(template.render(template_values))
		
		
class PaginaRegistro(webapp2.RequestHandler):
	"""Registro de anuncios"""
	def get(self): #mostrar pagina
		#variable de la plantilla
		template_values={
			'administrador': users.is_current_user_admin(),
			}
		
		template = jinja_environment.get_template('registro_anuncio.html')
		self.response.out.write(template.render(template_values))
	
	def post(self):
		"""datos formulario"""
		#TODO nombre en minusculas
		#sustituir espacios por guiones bajos:
		nombre_original = self.request.get('nombre')
		nombre = nombre_original.replace(' ','_')

		un_anuncio = Anuncio(key_name = nombre)
		
		un_anuncio.nombre = nombre
		un_anuncio.localidad = self.request.get('localidad')
		un_anuncio.provincia = self.request.get('provincia')
		un_anuncio.direccion = self.request.get('direccion')
		un_anuncio.telefono = self.request.get('telefono')
		un_anuncio.registro = datetime.date.today()
		un_anuncio.descripcion = self.request.get('descripcion')
		un_anuncio.validada = True
		un_anuncio.estado = "COMPLETED"
		un_anuncio.paykey = ""
		un_anuncio.url = self.request.get('url')
		#un_anuncio.user_id = users.get_current_user().user_id()
		un_anuncio.put()

		#agregamos ciudad con su popularidad
		q = db.Query(Ciudad)
		q.filter("nombre =", self.request.get('localidad'))

		una_ciudad = Ciudad(key_name = self.request.get('localidad'))
		una_ciudad.nombre = self.request.get('localidad')
		una_ciudad.popularidad = q.count()+1
		una_ciudad.put()
		

		self.redirect('/anuncio/' + nombre)
		
		
		
class PaginaPerfilUsuario(webapp2.RequestHandler):
	"""Pagina de perfil de usuario"""
	def get(self): #mostrar pagina
		#variable de la plantilla
		template_values={
			'administrador': users.is_current_user_admin(),
			}
		
		template = jinja_environment.get_template('perfil_usuario.html')
		self.response.out.write(template.render(template_values))


class PaginaAdministracion(webapp2.RequestHandler):
	"""Pagina de administracion"""

	def get(self):
		"""Muestra formulario y tabla de tags"""
		tags = db.GqlQuery("SELECT nombre FROM Tag")
		
                #comprobar
		#login
		user = users.get_current_user()
		
		if user:
			url = users.create_logout_url(self.request.uri)
			url_text = 'logout'
			
		else:
			url = users.create_login_url(self.request.uri)
			url_text = 'login'
		
		
                #variable de la plantilla
		template_values={
			'url': url,
			'url_text': url_text,
			'nombre_usuario': user,
			'administrador': users.is_current_user_admin(),
			'tags':tags,
		}

		template = jinja_environment.get_template('administracion.html')
		self.response.out.write(template.render(template_values))

	def post(self):
		"""Recoge datos nuevo tag y responde con todos los tags"""
		
		#TODO insertar un campo para accion: solo respuesta; insertar nuevo y respuesta.

		#insercion nuevo tag
		t=Tag(key_name = self.request.get('tag'))
		t.nombre = self.request.get('tag')
		t.put()

		self.redirect('/administracion')


#esqueleto
app = webapp2.WSGIApplication([('/',PaginaPrincipal),
			       ('/busqueda', PaginaBusqueda),
			       ('/anuncio/(.*)', PaginaAnuncio),
			       ('/anuncio/(.*)/modificar',PaginaPerfilAnuncio),
			       ('/registro', PaginaRegistro),
			       ('/perfil',PaginaPerfilUsuario),
			       ('/administracion',PaginaAdministracion),
			       ],
			      debug=True)
